package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;

import javax.inject.Inject;
import org.apache.log4j.Logger;

import org.springframework.stereotype.Service;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCliente;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Cliente;
@Service
public class ServicioClienteImpl implements IServicioCliente, Serializable {

    private static final long serialVersionUID = -4727188952267726785L;
    
    @Inject
    private IDAOCliente daoCliente;

    @Override
    public Collection<Cliente> listarClientesActivos() throws ServiceException{
        try {
            return daoCliente.listarActivos(Cliente.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    
    @Override
    public Cliente conseguirClientePorId(Integer idCliente) throws ServiceException{
        try {
            return daoCliente.obtenerEntidadPorId(Cliente.class, idCliente);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    @Override
    public void guardarCliente(Cliente cliente)
            throws ServiceException {
        try {
            cliente.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoCliente.insertar(cliente);
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }

    @Override
    public ResultadoServicio actualizarCliente(Cliente cliente)
            throws ServiceException {
        try {
            daoCliente.actualizar(cliente);
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
        return null;
    }

    @Override
    public Collection<Cliente> listarClientesPorFiltro(Cliente cliente)
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("numeroDocumento", cliente.getNumeroDocumento());
        parametros.put("nombreComercial", cliente.getNombreComercial());
        parametros.put("razonSocial", cliente.getRazonSocial());
        if(cliente.getTipoCliente()!='0'){
            parametros.put("tipoCliente", ""+cliente.getTipoCliente());
        }
        
        parametros.put("estadoRegistro", ""+ESTADO_REGISTRO.ACTIVO.getValor());
        try {
            return daoCliente.obtenerColeccionEntidadPorFiltros(Cliente.class, parametros);
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }

    @Override
    public void eliminarCliente(Cliente cliente) throws ServiceException {
        cliente.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        try {
            daoCliente.actualizar(cliente);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    } 
    
    @Override
    public Cliente conseguirClienteConUbigeo(Integer idCliente) throws ServiceException{
        try {
            return daoCliente.obtenerEntidadConUbigeo(idCliente);
        } catch (DAOException ex) {
            java.util.logging.Logger.getLogger(ServicioClienteImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
       
    }

    @Override
    public boolean validarRuc(String ruc) throws ServiceException{
        try {
            if(daoCliente.validarRuc(ruc)==null)
                return true;
            else return false;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean validarRazonSocial(String razonSocial) throws ServiceException{
        try {
            if(daoCliente.validarRazonSocial(razonSocial)==null)
                return true;
            else return false;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean validarCodigo(String codigo) throws ServiceException{
        try {
            if(daoCliente.validarCodigo(codigo)==null)
                return true;
            else return false;
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    @Override
    public Cliente obtenerClientePorRazonSocial(String razonSocial) throws ServiceException{
        try {
            return daoCliente.validarRazonSocial(razonSocial);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<Cliente> listarClientesTipo(Cliente cliente) throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("tipoCliente", cliente.getTipoCliente());
        parametros.put("razonSocial", cliente.getRazonSocial());
        
        parametros.put("estadoRegistro", ""+ESTADO_REGISTRO.ACTIVO.getValor());
        try {
            return daoCliente.obtenerColeccionEntidadPorFiltros(Cliente.class, parametros);
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }
    
    
}
